
package com.zsrt.devbase.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ws.rs.PathParam;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.zsrt.devbase.common.utils.ConstantDefine;
import com.zsrt.devbase.common.utils.ReflectUtil;
import com.zsrt.devbase.dao.BaseDAO;
import com.zsrt.devbase.service.IService;

/**
 * 针对单表条件查询、增加、删除、修改
 */
public abstract class BaseService<T> implements IService<T> {
	protected Logger logger = null;

	public BaseService() {
		logger = Logger.getLogger(getClass().getName());
	}
    @Autowired
    protected  BaseDAO <T> baseDAO;
    
    @Override
    public T selectByKey(@PathParam("key") String key) {
        return baseDAO.selectByPrimaryKey(key);
    }
    
    @Override
	public T selectOne(T entity){
		return baseDAO.selectOne(entity);    	
    }
    
    @Override
    public List<T> select(T entity){
		return baseDAO.select(entity);    	
    }

    public boolean save(T entity) {
    	int rs = baseDAO.insert(entity);
    	return rs > 0;
    }

    public int deleteByPrimaryKey(String key) {
        return baseDAO.deleteByPrimaryKey(key);
    }
    
    /**
     * 根据主键更新实体全部字段，null值会被更新，小心使用
     */
    public int updateByPrimaryKey(T entity) {
        return baseDAO.updateByPrimaryKey(entity);
    }

    /**
     * 根据主键更新属性不为null的值
     */
    public int updateNotNull(T entity) {
        return baseDAO.updateByPrimaryKeySelective(entity);
    }
    
    /**
	 * 校验通过，则新增数据
	 * @param 实体
	 * @return 返回 null，则保存成功，否则为错误信息
	 */
	public Map<String,Object> checkAndSave(T entity){
		//先调用数据校验
		Map<String,Object> errorMap = this.check(entity);
		//存在错误则返回
		if(errorMap!=null && !errorMap.isEmpty()){
			return errorMap;
		}
		//检查数据是否存在
		errorMap = this.checkEntityExists(entity);
		if(errorMap!=null && !errorMap.isEmpty()){
			return errorMap;
		}
		//保存
		boolean flag = save(entity);
		if(!flag){
			errorMap = new HashMap<>();
			errorMap.put(ConstantDefine.SYS_ERROR_KEY,  "信息无法保存到系统");
		}else{
			errorMap.put(ConstantDefine.SUCCESS, "数据已保存");
		}
		return errorMap;
	}
	
	/**
	 * 实现自定义业务校验规则，保存、修改都会调用check方法进行校验
	 */
	public abstract Map<String, Object> check(T entity);
	
	@SuppressWarnings("unchecked")
	public Map<String, Object> checkEntityExists(T entity){
		T entity2 = null;
		try {
			entity2 = (T) entity.getClass().newInstance();
		} catch (Exception e) {
			logger.error("查检存在相同记录时出现异常", e);
		}
		//复制对象属性时，去掉id、creator、createTime、modify、modifyTime，才能查询出是否有重复记录
		ReflectUtil.copyProperties(entity, entity2);
		List<T> old = select(entity2);
		Map<String,Object> errorMap = new HashMap<>();
		//数据存在
		if(old.size() > 0 ){
			errorMap.put(ConstantDefine.CHECK_ERROR, "系统中已有该条数据");
			return errorMap;
		}
		return errorMap;
	}
	
    /**
	 * 更新实体
	 * @param entity 实体
	 * @param isUpdateNull ：true表示null值会被更新到数据库中，小心使用
	 * @return
	 */
	public Map<String, Object> checkAndUpdate(T entity,boolean isUpdateNull){
		//先调用数据校验
		Map<String,Object> errorMap = this.check(entity);
		//存在错误则返回
		if(errorMap!=null && !errorMap.isEmpty()){
			return errorMap;
		}
		if(errorMap!=null && !errorMap.isEmpty()){
			return errorMap;
		}
		int result =0;
		//更新数据
		if(isUpdateNull){
			result = updateByPrimaryKey(entity);
		} else {
			result = updateNotNull(entity);
		}
		errorMap = new HashMap<String, Object>();
		if(result > 0)
			errorMap.put(ConstantDefine.SUCCESS, ConstantDefine.SUCCESS_INFO);
		else 
			errorMap.put(ConstantDefine.CHECK_ERROR, ConstantDefine.FAIL_INFO);
		return errorMap;		
	}
    
}
